<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>search_as_you_type(输入即搜索)数据类型 | ElasticSearch 7.7 权威指南中文版</title>
	<meta name="keywords" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <meta name="description" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
	<script>
	var _link = 'search-as-you-type.html';
    </script>
</head>
<body>
<div class="main-container">
    <section id="content">
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.7/search-as-you-type.html" rel="nofollow" target="_blank">https://www.elastic.co/guide/en/elasticsearch/reference/7.7/search-as-you-type.html</a>, 原文档版权归 www.elastic.co 所有<br/>本地英文版地址: <a href="../en/search-as-you-type.html" rel="nofollow" target="_blank">../en/search-as-you-type.html</a></div>
                        <!-- start body -->
                  <div class="page_header">
<strong>重要</strong>: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html" rel="nofollow">当前版本文档</a>。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch 权威指南 [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="mapping.html">映射</a></span>
»
<span class="breadcrumb-link"><a href="mapping-types.html">字段数据类型</a></span>
»
<span class="breadcrumb-node">search_as_you_type(输入即搜索)数据类型</span>
</div>
<div class="navheader">
<span class="prev">
<a href="rank-features.html">« rank_features(特征排名)数据类型</a>
</span>
<span class="next">
<a href="sparse-vector.html">sparse_vector(稀疏向量)数据类型 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="search-as-you-type"></a>search_as_you_type(输入即搜索)数据类型
</h2>
</div></div></div>

<p>
<code class="literal">search_as_you_type</code>字段类型是一种类似文本的字段，它经过优化，为服务于随输入补全用例的查询提供开箱即用的支持。

它创建了一系列子字段，对这些子字段进行分析，以索引能够被部分匹配整个索引文本值的查询有效匹配的词项。

前缀补全(即匹配输入开头的词项)和中缀补全(即匹配输入中任何位置的词项)都受支持。
</p>
<p>当将这种类型的字段添加到映射时</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT my_index
{
  "mappings": {
    "properties": {
      "my_field": {
        "type": "search_as_you_type"
      }
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/698.console"></div>
<p>这将创建以下字段：</p>
<div class="informaltable">
<table border="0" cellpadding="4px">
<colgroup>
<col>
<col>
</colgroup>
<tbody valign="top">
<tr>
<td valign="top">
<p>
<code class="literal">my_field</code>
</p>
</td>
<td valign="top">
<p>
这个字段会按照映射中的配置进行分析。如果没有配置分析器，则使用索引的默认分析器
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">my_field._2gram</code>
</p>
</td>
<td valign="top">
<p>
用瓦片<span class="remark">(shingle)</span>大小为 2 的瓦片词元过滤器包装<code class="literal">my_field</code>的分析器
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">my_field._3gram</code>
</p>
</td>
<td valign="top">
<p>
用分块<span class="remark">(shingle)</span>大小为 3 的分块词元过滤器包装<code class="literal">my_field</code>的分析器
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">my_field._index_prefix</code>
</p>
</td>
<td valign="top">
<p>
使用一个 edge ngram 词元过滤器包装<code class="literal">my_field._3gram</code>的分析器
</p>
</td>
</tr>
</tbody>
</table>
</div>
<p>
子字段中分块的大小可以通过映射参数<code class="literal">max_shingle_size</code>来配置。

默认值为 3，该参数的有效值为 2 - 4 之间的整数值。

将为从 2 到 <code class="literal">max_shingle_size</code>(包括最大值)的每个分块大小创建分块子字段。

<code class="literal">my_field._index_prefix</code>子字段在构建自己的分析器时，将始终使用具有<code class="literal">max_shingle_size</code>的分块子字段中的分析器。
</p>
<p>
增加<code class="literal">max_shingle_size</code>的值，将提高具有更多连续词项的查询的匹配度，但代价是索引更大。

默认的<code class="literal">max_shingle_size</code>通常就足够了。
</p>
<p>
当被索引的文档具有根字段<code class="literal">my_field</code>的值时，相同的输入文本被自动索引到这些字段中的每一个中，具有各自不同的分析链。
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT my_index/_doc/1?refresh
{
  "my_field": "quick brown fox jump lazy dog"
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/699.console"></div>
<p>
最有效的查询方式通常是<a class="xref" href="query-dsl-match-bool-prefix-query.html" title="匹配布尔前缀查询"><code class="literal">bool_prefix</code></a>类型的<a class="xref" href="query-dsl-multi-match-query.html" title="多匹配查询"><code class="literal">multi_match</code></a>查询，其目标是根<code class="literal">search_as_you_type</code>字段及其分块子字段。

这可以以任何顺序匹配查询词项，但是如果文档在一个分块子字段中按顺序包含这些词项，那么文档的得分会更高。
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET my_index/_search
{
  "query": {
    "multi_match": {
      "query": "brown f",
      "type": "bool_prefix",
      "fields": [
        "my_field",
        "my_field._2gram",
        "my_field._3gram"
      ]
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/700.console"></div>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
  "took" : 44,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.8630463,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.8630463,
        "_source" : {
          "my_field" : "quick brown fox jump lazy dog"
        }
      }
    ]
  }
}</pre>
</div>
<p>
要按顺序搜索与查询词项严格匹配的文档，或使用短语查询的其他属性进行搜索，请在根字段上使用<a class="xref" href="query-dsl-match-query-phrase-prefix.html" title="匹配短语前缀查询"><code class="literal">match_phrase_prefix</code>查询</a>。

如果最后一个词项应该完全匹配，而不是作为前缀，也可以使用<a class="xref" href="query-dsl-match-query-phrase.html" title="匹配短语查询"><code class="literal">match_phrase</code>查询</a>。

使用短语查询的效率可能不如使用<code class="literal">match_bool_prefix</code>查询。
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET my_index/_search
{
  "query": {
    "match_phrase_prefix": {
      "my_field": "brown f"
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/701.console"></div>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="specific-params"></a><code class="literal">search_as_you_type</code>字段的特定参数
</h3>
</div></div></div>
<p><code class="literal">search_as_you_type</code>字段的映射中接受以下参数，且这些参数是特定于该字段类型的</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">max_shingle_size</code>
</span>
</dt>
<dd>
<p>(可选, 整型) 要创建的最大分块尺寸。 有效值是<code class="literal">2</code> (含) 到 <code class="literal">4</code> (含)。默认值为 <code class="literal">3</code>。</p>
<p>
为 <code class="literal">2</code> 和该值之间的每个整数创建一个子字段。

例如，值<code class="literal">3</code>创建两个子字段：<code class="literal">my_field._2gram</code>和<code class="literal">my_field._3gram</code>
</p>
<p>更多的子字段支持更具体的查询，但会增加索引大小。</p>
</dd>
</dl>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="general-params"></a>作为文本字段的字段类型的参数
</h3>
</div></div></div>
<p>
由于<code class="literal">search_as_you_type</code>字段本质上是一个类似文本的字段，因此在该字段的映射中接受以下参数，这些参数的行为与配置<a class="xref" href="text.html" title="文本数据类型"><code class="literal">text</code></a>数据类型的字段时的行为类似。

除非另有说明，否则这些选项以相同的方式配置根字段子字段。
</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<a class="xref" href="analyzer.html" title="analyzer"><code class="literal">analyzer</code></a>
</span>
</dt>
<dd>
应该在索引时和搜索时用于文本字段的<a class="xref" href="analysis.html" title="文本分析">analyzer(分析器)</a>分析器(除非被<a class="xref" href="search-analyzer.html" title="search_analyzer"><code class="literal">search_analyzer</code></a>覆盖)。

默认值为默认的索引分析器，或者<a class="xref" href="analysis-standard-analyzer.html" title="标准分析器"><code class="literal">standard</code>分析器</a>。
</dd>
<dt>
<span class="term">
<a class="xref" href="mapping-index.html" title="index"><code class="literal">index</code></a>
</span>
</dt>
<dd>
字段应该是可搜索的吗？接受<code class="literal">true</code> (默认) 或 <code class="literal">false</code>。
</dd>
<dt>
<span class="term">
<a class="xref" href="index-options.html" title="index_options"><code class="literal">index_options</code></a>
</span>
</dt>
<dd>
为了搜索和高亮显示，应该在索引中存储什么信息。默认为<code class="literal">positions</code>。
</dd>
<dt>
<span class="term">
<a class="xref" href="norms.html" title="norms"><code class="literal">norms</code></a>
</span>
</dt>
<dd>
查询评分时是否应考虑字段长度。

接受<code class="literal">true</code> 或 <code class="literal">false</code>。

该选项配置根字段和分块子字段，其默认值为<code class="literal">true</code>。

当它为<code class="literal">false</code>时，不配置前缀子字段。
</dd>
<dt>
<span class="term">
<a class="xref" href="mapping-store.html" title="store"><code class="literal">store</code></a>
</span>
</dt>
<dd>
字段值是否应该与<a class="xref" href="mapping-source-field.html" title="_source field"><code class="literal">_source</code></a>字段分开存储和检索。

接受<code class="literal">true</code> 或 <code class="literal">false</code> (默认)。

此选项仅配置根字段，不配置任何子字段。
</dd>
<dt>
<span class="term">
<a class="xref" href="search-analyzer.html" title="search_analyzer"><code class="literal">search_analyzer</code></a>
</span>
</dt>
<dd>
应该在搜索<a class="xref" href="text.html" title="文本数据类型"><code class="literal">text</code></a>字段时使用的<a class="xref" href="analyzer.html" title="分析器"><code class="literal">analyzer(分析器)</code></a>。

默认为<code class="literal">analyzer</code>设置。
</dd>
<dt>
<span class="term">
<a class="xref" href="analyzer.html#search-quote-analyzer" title="search_quote_analyzer"><code class="literal">search_quote_analyzer</code></a>
</span>
</dt>
<dd>
当遇到短语时，在搜索时应该使用的<a class="xref" href="analyzer.html" title="分析器"><code class="literal">analyzer(分析器)</code></a>。

默认为<code class="literal">search_analyzer</code>设置。
</dd>
<dt>
<span class="term">
<a class="xref" href="similarity.html" title="similarity"><code class="literal">similarity</code></a>
</span>
</dt>
<dd>
应该使用哪种评分或<em>相似度</em>算法。默认为<code class="literal">BM25</code>。
</dd>
<dt>
<span class="term">
<a class="xref" href="term-vector.html" title="term_vector"><code class="literal">term_vector</code></a>
</span>
</dt>
<dd>
是否应为字段存储词项向量。

默认为<code class="literal">no</code>。

此选项配置根字段和分块子字段，但不配置前缀子字段。
</dd>
</dl>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="prefix-queries"></a>前缀查询优化
</h3>
</div></div></div>
<p>
当对根字段或它的任何子字段进行<a class="xref" href="query-dsl-prefix-query.html" title="前缀查询"><code class="literal">prefix(前缀)</code></a>查询时，查询将被重写为对<code class="literal">._index_prefix</code>子字段的<a class="xref" href="query-dsl-term-query.html" title="词项查询"><code class="literal">term</code></a>查询。

这比典型的对文本字段的<code class="literal">prefix</code>查询更有效，因为每个分块的特定长度的前缀被直接索引为<code class="literal">._index_prefix</code>子字段。
</p>
<p>
<code class="literal">._index_prefix</code>子字段的分析器稍微修改了分块构建的行为，以便在字段值的末尾也索引通常不会作为分块产生的词项的前缀。

例如，如果值<code class="literal">quick brown fox</code>被索引到<code class="literal">max_shingle_size</code>为3的<code class="literal">search_as_you_type</code>字段中，则<code class="literal">brown fox</code>和<code class="literal">fox</code>的前缀也被索引到<code class="literal">._index_prefix</code>子字段，即使它们不会以词项的形式出现在<code class="literal">._3gram</code>子字段中。

这允许字段输入中的所有词项的自动完成。
</p>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="rank-features.html">« rank_features(特征排名)数据类型</a>
</span>
<span class="next">
<a href="sparse-vector.html">sparse_vector(稀疏向量)数据类型 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>